<?php

class AdminRelatoController extends BaseController {

    use HandleImagesTrait, OrderEntityTrait; // traits para addImagesToEntidad() & ordenarEntidades()

    public function ordenar() {
        $this->ordenarEntidades(Input::get('items'), 'Relato');
    }
    /**
     * Display a listing of the resource.
     *
     * @return Response
     */
    public function index() {

        $relatos = Relato::orderBy('position')->with('tags')->get();
        return View::make('admin.relatos.index', ['relatos' => $relatos]);
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return Response
     */
    public function create() {
        $tags = TagRel::getTagSinAnonima()->lists('nombre', 'id');
        $objetos = Objeto::lists('nombre','id');
        return View::make('admin.relatos.create', ['tags' => $tags, 'objetos' => $objetos]);
    }

    /**
     * Store a newly created resource in storage.
     *
     * @return Response
     */
    public function store() {
        // validate campos Relato
        //$validatorRel = Relato::validate(Input::all());
        $validatorRel = Validator::make(Input::all(), Relato::$rules);
        
        // validate imagenes
        foreach (Input::file('files') as $file) {
            $validatorImg = Imagerel::validate(['file' => $file]);
            if ($validatorImg->fails()) {
                return Redirect::back()->withErrors($validatorImg)->withInput();
            }
        }

        // process the form
        if ($validatorRel->fails()) {
              return Redirect::back()->withErrors($validatorRel)->withInput();
        } else {

            // crea el slug a partir del titulo
            $titulo = Input::get('titulo');
            $slug = Str::slug($titulo, $separator = '-');

            // store
            $relato = new Relato;
            $relato->titulo = $titulo;
            $relato->texto = Input::get('texto');
            $relato->slug = $slug;
//            $relato->link = Input::get('link');
            $relato->bajada = Input::get('bajada');
            $relato->position = 0;
            $relato->estado = Input::get('estado');

            // Transaccion
            // incrementa las posiciones de todos los relatos de la tabla
            // luego crea el nuevo relato en la tabla con pos = 1
            // orderBy es necesario para no violar la restriccion 
            // unique de position en el incremento
            // sync() actualiza los registros en tabla pivot
            
            DB::transaction(function($relato) use ($relato) {
                DB::table('relatos')
                    ->orderBy('position', 'desc')
                    ->where('position', '>=', 0)
                    ->increment('position');
                $relato->save();
                $relato->tags()->sync(array(Input::get('tags')));
                if(!Input::get('objetos')== null){
                $relato->objetos()->sync(Input::get('objetos'));
                }
                // Sincroniza un array de valores (select multiple)
                // $relato->tags()->sync(Input::get('tags'));
            });
            
            //Image managing
            if(Input::hasFile('files')){
                $this->addImagesToEntidad(Input::file('files'), $relato, 'relato_id', 'imagerel_relato', 'Imagerel');
            }
            // redirect
            Session::flash('message', 'El nuevo relato fue creado');
            return Redirect::to('admin/relatos');
        }        
    }

    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @return Response
     */
    public function show($id) {
        $relato = Relato::with([
                    'objetos' => function($query) {
                        $query->with(['imagesOrdered' => function($query) {$query->where('imageobj_objeto.position', 0);}])->orderBy('position');
                    },
                    'firstTag' => function($query) {
                        $query->select('nombre');
                    }
                ])
                ->find($id);
        if( is_null($relato)) {
            App::abort(404);
        }

        $tag = $relato->firstTag->first(); // le pasamos el objeto
        $images = $relato->imagesOrdered;
        $objetos = $relato->objetos;

        return View::make('admin.relatos.show', compact('relato', 'tag', 'images', 'objetos'));        // get the Relato
//        $relato = Relato::find($id);

        // show the view and pass the relato to it
//        return View::make('admin.relatos.show', ['relato' => $relato]);
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  int  $id
     * @return Response
     */
    public function edit($id) {
        // get the relato
        $relato = Relato::with('tags')->find($id);
        $tags = TagRel::getTagList();
        $images = $relato->imagesOrdered;
        $entidad = 'relato';
        $objetos = Objeto::lists('nombre','id');
        // show the edit form and pass the nerd
        return View::make('admin.relatos.edit', ['relato' => $relato, 'tags' => $tags, 'images' => $images, 'entidad' => $entidad, 'objetos' => $objetos]);
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  int  $id
     * @return Response
     */
    
    // This controller method will process the edit form. 
    // It is very similar to store(). We will validate, update, and redirect.
    
    public function update($id) {
        // validate campos Relato
        // $validatorRel = Relato::validate(Input::all());
        $validatorRel = Validator::make(Input::all(), Relato::$rules);
        
        // validate imagenes
        foreach (Input::file('files') as $file) {
            $validatorImg = Imagerel::validate(['file' => $file]);
            if ($validatorImg->fails()) {
                return Redirect::back()->withErrors($validatorImg)->withInput();
            }
        }

        // process Relato
        if ($validatorRel->fails()) {
            return Redirect::back()->withErrors($validatorRel)->withInput();
        } 
        else {
            // crea el slug a partir del Titulo
            $titulo = Input::get('titulo');
            $slug = Str::slug($titulo, $separator = '-');

            // store
            $relato = Relato::find($id);
            $relato->titulo = $titulo;
            $relato->texto = Input::get('texto');
            $relato->slug = $slug;
//            $relato->link = Input::get('link');
            $relato->bajada = Input::get('bajada');
            // position no cambia;
            $relato->estado = Input::get('estado');
//            $dt = new DateTime;
            // created_at no cambia;
//            $relato->updated_at = $dt;
            
            DB::transaction(function($relato) use ($relato) {
                $relato->save();
                $relato->tags()->sync(array(Input::get('tags')));
                if(!Input::get('objetos')== null){
                $relato->objetos()->sync(Input::get('objetos'));
                }
                else{
                    $relato->objetos()->sync(array());
                }
            });

            //Image managing
            if(Input::hasFile('files')){
                $this->addImagesToEntidad(Input::file('files'), $relato, 'relato_id', 'imagerel_relato', 'Imagerel');
            }

            // redirect
            Session::flash('message', 'Relato modificado');
            return Redirect::to('admin/relatos');
        }
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return Response
     */
    public function destroy($id) {
        // delete
        $relato = Relato::find($id);
        
        DB::transaction(function($relato) use ($relato) {
            
            foreach($relato->images as $img){
                $img->delete();
            }
            $relato->delete();

            DB::table('relatos')
                ->orderBy('position')
                ->where('position', '>', $relato->position)
                ->decrement('position');
        });
        
        // redirect
        Session::flash('message', 'Eliminación exitosa');
        return Redirect::to('admin/relatos');
    }
}
